package com.efuture.chaptersix

import com.efuture.chaptersix.Consumer as Consumer

/* @Description: Kotlin语言in关键字学习
 * @Auther: zhaoshanshan
 * @Date: 2022/03/08/4:32 下午
 */
interface Consumer<in T>{ //
    fun consume(itme:T)//in关键字 只能被修改 不能被读取
    //fun comsume():T 改行代码会报错 因为in关键字不能被读取
}
open class Animal1();
open class Persons1():Animal1()
open class Man1():Persons1()
open class Woman1():Persons1()
class ConsumerClass1: Consumer<Animal1>{
    override fun consume(itme: Animal1) {
        println("消费Animal")
    }

}
class ConsumerClass2: Consumer<Persons1>{
    override fun consume(itme: Persons1) {
        println("消费Persons1")
    }

}
class ConsumerClass3: Consumer<Man1>{
    override fun consume(itme: Man1) {
        println("消费Man1")
    }

}
class ConsumerClass4: Consumer<Woman1>{
    override fun consume(itme: Woman1) {
        println("消费Woman1")
    }

}
fun main() {

    val p1:Consumer<Man1> = ConsumerClass1();//相当于子类赋给了父类 因为有in 关键字
    val p2:Consumer<Woman1> = ConsumerClass2(); //相当于子类赋给了父类 因为有in 关键字
    // 默认情况下： 泛型具体出的父类  是不可以赋值给  泛型声明处的子类的
    // in：泛型具体出的父类  是可以赋值给  泛型声明处的子类的

    // 逆变：子类 泛型声明处  可以接收   父类 泛型具体处


    // 协变：out 父类 = 子类
    // 逆变：in  子类 = 父类
}